if ( !window.controller ) throw new Error( '"controller" not initialized' );
if(!controller.user){
	controller.user = function(){
		var $ = controller
		
		//var _data 		= new $.User.Data();
		//var 
		
		var User = function()
		{
			UserSuperPrototype.constructor.call( this );			
			this.dataProvider; 			
			this.__init = false;						
		}
		
		$.extend( User, $.events.EventDispatcher );
		var UserPrototype = User.prototype,
		UserSuperPrototype = User.superPrototype;
		var dispatchEvent= UserSuperPrototype.dispatchEvent;
		var EEvent = $.events.Event;

		UserPrototype.init = function(data){
			for(var pid in data)
			{
				this["_"+pid] = data[pid];
			}			
															
			// Говорим о том что можно стартовать таймер востановления свойств
			var event 	 = new EEvent( "START_TIMER_EVENT" );
				dispatchEvent.call( this, event);						
			
			this.__init = true;
		}				
		
		UserPrototype.setProvider = function(provider){
			this.dataProvider = provider;
			// События пришедшии из аякса
			this.dataProvider.addEventListener("AJAX", 				this, processEvent);
			this.dataProvider.addEventListener("REALPLEXOR", 		this, processEvent);
			this.dataProvider.addEventListener("AJAX_END_COMMAND", 	this, endCommandEvent);
		}
		var endCommandEvent = function(e){
			dispatchEvent.call( this, e);
		}
        
        // Геттер    
        UserPrototype.get = function(name)
        {
            var pName = "_"+name;
            if(this[pName]){
                return this[pName];
            }
        }
		
		/**
		* Обработчик входящих данных
		* Ajax и realplexor
		*/
		var processEvent = function(e){
			// Отлавливаем массовые изменения и приход данных связанный с юзером.
			switch(e.action){								
				
				// Сообщение
				case("infoMessage"):
					wj.dialog.Add(e.data.title, e.data.content, e.data.type);
				break;
				
				// Добавили новую ячейку
				case("newField"):
					this.newField(e.data);						
				break;												
				
				// Удалили ячейку
				case("deleteField"):
					this.deleteField(e.data);					
				break;		
				
				// Выйти
				case("logout"):
					this.logout(e.data);
				break;		
				
				// Войти
				case("login"):
					this.login(e.data);
				break;		
                
                // Изменить текщую директорию
                case("changeUserDir"):
                    this.changeUserDir(e.data);
                break;     
                
                // Открыть контэнт
                case("openContent"):
                    this.openContent(e.data);
                break;      
                
                // Очистить ячейки
                case("clearFolders"):
                    //this._folders = null;
                break;
                  
                
				
				default:
					console.log("User processEvent :"+ e.action);
				
			}
			
		}
		
        
        // Открыть контэнт ячейки с id
        UserPrototype.openContent = function(id)
        {
            if (wj)
            {
                wj.app.app.css("overflow-y", "auto");
                curEditMode = "";
                curEditID = id;
                wj.Exec({"m": "Location", "op": "OpenContent", "id": id});
            }
        }
        
        // Получить все ячейки
        UserPrototype.getFields = function()
        {
        	return this._folders;
		}
        
        // Получить ячейку с id
        UserPrototype.getField = function(id)
        {
            if (this._folders && this._folders[id])    
            {
                return this._folders[id];
            }
            else
            {
                return null;
            }
        }
        
		// Изменить текщую директорию
		UserPrototype.changeUserDir = function(dir)
        {
            if (wj)
                wj.app.app.css("overflow-y", "hidden");
            this._dir = dir;  
            if (wj)
            {
                wj.Exec({"m":"Location", op:"Index"});
            }
        }
        
		// Вход
		UserPrototype.login = function(data)
		{                        
            this.clear();
            if (data.readonly)
                isAuth = false;
            else
			    isAuth = true;			
            if (wj)
            {
			    wj.app.menu.find("a#bLogin").hide();					
			    wj.app.menu.find("a#bLogout").show();
			    wj.app.menu.find("div#menu a.actBut").show();
            }
			this.init(data);			
						
            incLogin ++;
            if (incLogin == 1)
            {                
                if (wj)
                {
                    wj.Exec({"m": "Location", "op": "Index"});
                    wj.Exec(wj.parseLocation(incLoginData));
                    console.log("start in: "+incLoginData);                 
                }
            } 
            else
            {
                location.href="#m=Location&op=Index";
            }                          
		}
		
		// Выход
		UserPrototype.logout = function(data)
		{
			isAuth = false;
			this.clear();	
            if (wj)
            {
                wj.app.menu.find("a#bLogin").show();                    
                wj.app.menu.find("a#bLogout").hide();                    
                wj.app.menu.find("div#menu a.actBut").hide();                    
            }
			location.href="#m=Location&op=Index";
		}
		
		// Очистка инфы пользователя после выхода
		UserPrototype.clear = function()
		{
			this.__init = false;
			if (this._folders)
				this._folders = null;
            this._dir = 0;
		}
		
		// Удаляем ячейку
		UserPrototype.deleteField = function(id)
		{
			if (this._folders)
				delete this._folders[id];
            if (wj)
            {
                wj.app.app
                wj.app.app.find("div#field_"+id).remove();
            }
		}
		
		// Удаляем ячейку
		UserPrototype.newField = function(data)
		{
            if (!this._folders)
                this._folders = {};
            this._folders[data.id] = data;            
            
            
            if (data.id == curEditID && curEditMode != "")
            {
                if (wj)
                {
                    wj.ExecC({"c": "editFieldContent", "type": "back", "twa": wj.getComandID()});
                }
            }
            else
            {
                var html = wj.getDis().tpl("Field", data);
                if (wj && this._dir == data.parent_id)
                {
                    wj.app.app.append(html);                    
                } 
            }
         			
			       
		}
        
        
		
		
		
		return User;
	}();							

}